前情提要:
根據上一篇我將nginx基本的設定設好了之後,遇到了以下問題。
從外部試著連入我的主機, 出現
nginx/1.18.0 (Ubuntu)
於是我嘗試檢查我的FPM的狀況
systemctl list-units --type=service | grep php(未顯示任何東西)
sudo systemctl start php8.2-fpm
Failed to start php8.2-fpm.service: Unit php8.2-fpm.service not found.
後來我發現我沒有安裝php-fpm.
安裝FPM
sudo apt-get update
sudo apt-get install php8.2-fpm
sudo systemctl start php8.2-fpm
sudo systemctl status php8.2-fpm
apache沒關
然後確認了fpm有在運作之後, 仍然出現502。
後來使用curl http://127.0.0.1發現返回在apache的首頁
懷疑是apache沒關好, 於是用:
sudo systemctl disable apache2
後來不會出現502,但出現了500 錯誤, 因為他還停留在nginx預設的錯誤畫面, 於是想說去看看nginx的error.log, 看會不會有什麼描述。
tail -f /var/log/nginx/error.log
結果出現了
1. **`PHP Warning: require(/var/www/pokemonProject/public/../vendor/autoload.php): Failed to open stream: No such file or directory in /var/www/pokemonProject/public/index.php on line 34`**
2. **`PHP Fatal error: Uncaught Error: Failed opening required '/var/www/pokemonProject/public/../vendor/autoload.php' (include_path='.:/usr/share/php') in /var/www/pokemonProject/public/index.php:34`**
//這裡顯示了系統沒有辦法讀到autoload.php, 所以應該是我composer還沒安裝, 以及還未下載其相關套件, 於是用了composer安裝:
sudo apt install composer
結果要composer install的時候出現php 依賴項沒裝, composer會根據他要下載的東西所對應的php依賴項做檢查, 如果沒有他會提醒你(這裡沒有記錄到錯誤畫面)。
安裝或啟用PHP的curl
擴展:
sudo apt install php8.2-curl
這裡我就不多打了(根據你composer json設定去安裝php依賴套件)。
而當我composer安裝好之後, 執行composer install 把相關的依賴套件都安裝好,
還是出現500錯誤(傻眼), 然後我去nginx的error.log看:
tail -f /var/log/nginx/error.log
發現沒有新的錯誤產生(抱歉又漏紀錄了)。
所以我推測應該是有到專案裡, 所以我去專案的log 查看
sudo tail -n 50 storage/logs/laravel.log
出現了[2023-09-12 09:49:39] production.ERROR: No application encryption key has been specified。
看來是我.env文件的APP_KEY沒有設置。
要產生key可以使用以下指令:
php artisan key:generate
結果出現:
The stream or file "/var/www/pokemonProject/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied
The exception occurred while attempting to log: file_put_contents(/var/www/pokemonProject/.env): Failed to open stream: Permission denied
我的解決方法:
改存儲文件夾權限: 使用下列命令賦予運行應用的用戶適當的權限:
sudo chmod -R 775 /var/www/pokemonProject/storage
修改.env
文件權限: 確保您的 文件也有正確的權限:
sudo chmod 775 /var/www/pokemonProject/.env
您可能還需要確保文件和文件夾的所有者是正確的。通常web服務器運行為**www-data
**用戶和組。您可以使用 chown
命令修改文件和文件夾的所有者:
sudo chown -R ubuntu:www-data /var/www/pokemonProject/storage
sudo chown ubuntu:www-data /var/www/pokemonProject/.env
這個web server的使用者群組可以去相關的設定檔看或更改(像我的話可能是 /etc/nginx/nginx.conf), 裡面應該會看到 user www-data 或是Gruop www-data;
這裡的 R
參數表示「遞歸」,所以它不僅僅會更改 storage
目錄本身的所有者和群組,還會更改 storage
目錄下的所有子目錄和文件的所有者和群組。
這裡我會把使用者設為我目前身份(ubuntu)(這樣我操作者才有基本的權限),然後讓使用者群組設為www-data(讓enginx)有權限對這些檔案操作。
接著再去執行php artisan key:generate,就可以了。
畢竟是沒有什麼部署的經驗,所以我相當於是運行的時候看缺什麼才去安裝(老手可能會覺得我很X吧),但因為有記錄這些錯誤下次因該可以快一些。
看error log
而且這過程我覺得有學到一件事,就是當錯誤出現並且給你的信息含量很少的時候,可以嘗試去看log,除了會帶給你更多的錯誤訊息以外,甚至可以讓你判斷系統目前可能跑到哪了,比如目前在錯誤nginx日誌沒有更新,那就可以推測他可能已不是在nginx這裡出現錯誤,可能已經跑到專案裡了。